# -*- coding: utf-8 -*-
# ----------------------------
# @Author:    影子
# @Software:  PyCharm
# @时间:       2025/5/14 下午3:14
# @项目:       assist_test
# @FileName:  hkid_card.py
# ----------------------------
"""
香港身份证号的生成规则如下：
基本结构 ：香港身份证号码一般由 1 或 2 个英文字母加上 6 个数字组成，格式如 A123456（0）或 AB123456（0），最后括号内的数字或字母 A 为校验码。
字母含义 ：身份证号码中的字母有一定含义，例如 A 代表持证人拥有香港居留权，B 代表持证人所报称的出生日期或地点自首次登记以后曾作出更改，
C 代表持证人登记领证时在香港的居留受到入境事务处处长的限制，N 代表持证人所报的姓名自首次登记以后曾作出更改，O 代表持证人报称在香港、
澳门及中国以外其他地区或国家出生，R 代表持证人拥有香港入境权，U 代表持证人登记领证时在香港的居留不受入境事务处处长的限制，W 代表持证人
报称在澳门地区出生，X 代表持证人报称在中国大陆出生，Z 代表持证人报称在香港出生。
数字含义 ：6 个数字通常为顺序号，也可能包含持证人的出生年份的最后两位和出生年月日等信息，但并非绝对，不同情况下其代表的具体含义会有所差异，
例如对于 1980 年之前签发的身份证，前两位数字可能代表出生年份的最后两位数，接下来的两位数字代表出生的月份，再接下来的两位数字代表出生的日数，
而对于 1980 年之后签发的身份证，前六位数字的排列方式有所不同，第一位数字代表出生的年份，接下来的两位数字代表出生的月份，再接下来的三位数字
代表当月出生的顺序。
校验码计算方式 ：将首位字母改为数字，A 为 1，B 为 2，C 为 3…Z 为 26，再乘以 8；然后把字母后面的 6 个数字依次乘以 7、6、5、4、3、2；
再将以上所有乘积相加的和，除以 11，得到余数；如果整除，则括号中的校验码为 0，如果余数为 1，则校验码为 A，如果余数为 2～10，
则用 11 减去这个余数的差作校验码。

例如：P103265（1），P 在字母表中排行 16，则以 16 代表，则计算校验码为 16×8＋1×7＋0×6＋3×5＋2×4＋6×3＋5×2＝186，
186÷11＝16...... 余 10，11－10＝1，即校验码为 1。
"""

import random
import string

from common.logs import logger

def hong_kong_id_card():
    """
    生成香港身份证号码
    :return: 香港身份证号码
    """
    # 随机生成 1 个英文字母
    letters = random.sample(string.ascii_uppercase, random.randint(1, 1))

    # 随机生成 6 个数字
    numbers = ''.join(random.choices(string.digits, k=6))

    # 计算校验码
    letter_value = (ord(letters[0]) - ord('A') + 1) * 8
    number_values = sum(int(num) * [7, 6, 5, 4, 3, 2][i] for i, num in enumerate(numbers))
    total = letter_value + number_values
    remainder = total % 11
    # print(f"字母值：{letter_value}，数字值：{number_values}，总和：{total}，余数：{remainder}")

    if remainder == 0:
        check_code = '0'
    elif remainder == 1:
        check_code = 'A'
    else:
        check_code = str(11 - remainder)

    # 拼接身份证号码
    id_card = ''.join(letters) + numbers + '('+check_code+')'
    logger.info(f"香港身份证号：{id_card}")
    return id_card


if __name__ == '__main__':
    print(hong_kong_id_card())
